package org.blog.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * redis读写工具类
 */
@Component
public class RedisUtils {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 保存字符串类型的数据
     *
     * @param key   键
     * @param value 值
     */
    public void setString(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 获取字符串类型的数据
     *
     * @param key 键
     * @return 值
     */
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 删除字符串类型的数据
     *
     * @param key 键
     */
    public void delString(String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 添加或更新有序集合中的元素
     *
     * @param key    键
     * @param value  值
     * @param score  分数
     */
    public void addOrUpdateZSet(String key, String value, double score) {
        redisTemplate.opsForZSet().add(key, value, score);
    }

    /**
     * 获取有序集合中的元素及其分数
     *
     * @param key 键
     * @return 元素集合
     */
    public Set<String> rangeZSet(String key) {
        return redisTemplate.opsForZSet().range(key, 0, -1).stream().map(String::valueOf).collect(Collectors.toSet());
    }

    /**
     * 删除有序集合中的元素
     *
     * @param key   键
     * @param value 值
     */
    public void removeZSet(String key, String value) {
        redisTemplate.opsForZSet().remove(key, value);
    }

    /**
     * 保存哈希类型的数据
     *
     * @param key  键
     * @param hashKey 哈希键
     * @param value 值
     */
    public void setHash(String key, String hashKey, Object value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }

    /**
     * 获取哈希类型的数据
     *
     * @param key  键
     * @param hashKey 哈希键
     * @return 值
     */
    public Object getHash(String key, String hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    /**
     * 删除哈希键
     *
     * @param key  键
     * @param hashKey 哈希键
     */
    public void delHash(String key, Object hashKey) {
        redisTemplate.opsForHash().delete(key, hashKey);
    }

    /**
     * 左推入列表
     *
     * @param key   键
     * @param value 值
     */
    public void leftPushList(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 右推入列表
     *
     * @param key   键
     * @param value 值
     */
    public void rightPushList(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 获取列表区间的数据
     *
     * @param key   键
     * @param start 开始
     * @param end   结束
     * @return 列表区间的数据
     */
    public List<Object> rangeList(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }
}